#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "test.h"

/*
 * hoot exe
 *
 * sleep()函数，将其替换成 ac_sleep() 函数
 */

void *ac_sleep(size_t size)
{
    printf("--ac--- %zu bytes memory.\n", size);
}

int main()
{
    while (1) {
        sleep(1);
    }
    return 0;
}

#if 0

gcc -o hook-exe hook-exe.c -no-pie

readelf -r hook-exe

    Relocation section '.rela.plt' at offset 0x5e8 contains 1 entry:
      Offset          Info           Type           Sym. Value    Sym. Name + Addend
    000000404028  000500000007 R_X86_64_JUMP_SLO 0000000000000000 sleep@GLIBC_2.2.5 + 0

    sleep()函数的.got.plt表项地址为 0x000000404028 。
    因为exe文件地址和进程空间是对应的，所以这里不需要再加上偏移地址。

readelf -s hook-exe

    Symbol table '.symtab' contains 68 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name

    46: 0000000000401176    54 FUNC    GLOBAL DEFAULT   15 ac_sleep

    ac_sleep()函数的符号地址为 0x0000000000401176 ，因为在exe文件中所以也不需要加偏移。

ps -ef | grep hook-exe
    xiaozhi   377437  377105  0 17:29 pts/5    00:00:00 ./hook-exe

sudo gdb -q 377437

(gdb) x/xg 0x000000404028      // `.got.plt`表项中的值为 0x00007f1e611dddc0 ，对应sleep()
0x404028 <sleep@got.plt>:       0x00007f1e611dddc0

(gdb) set {long}0x000000404028=0x0000000000401176  // 修改成 0x0000000000401176 ，对应 ac_sleep()

(gdb) x/xg 0x000000404028
0x404028 <sleep@got.plt>:       0x0000000000401176

(gdb) c
    --ac--- 1 bytes memory.

#endif
